package br.uniceub.fsw.academicmobile.control;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;

import br.uniceub.fsw.academicmobile.dao.DisciplinaDAO;
import br.uniceub.fsw.academicmobile.dao.MaterialDAO;
import br.uniceub.fsw.academicmobile.dao.TurmaDAO;
import br.uniceub.fsw.academicmobile.util.FileUploadUtil;
import br.uniceub.fsw.academicmobile.vo.DisciplinaVO;
import br.uniceub.fsw.academicmobile.vo.MaterialVO;
import br.uniceub.fsw.academicmobile.vo.ProfessorVO;
import br.uniceub.fsw.academicmobile.vo.TurmaVO;

/**
 * Classe que abrange as operações relativas a materiais
 * Trabalha com o formulario do tipo multipart/form-data para upload de arquivos,
 * logo que a request chega, o metodo operacao a transforma em uma lista de itens de 
 * formulario.
 *@author Christian Miranda.
 */
public class MaterialBO {

    private MaterialVO material;
    private ProfessorVO professor;
    private TurmaVO turma;
    private DisciplinaVO disciplina;
    private MaterialDAO daoMaterial;
    private TurmaDAO daoTurma;
    private DisciplinaDAO daoDisciplina;
	
    /**
     * Recebe a request da tela e a direciona para o metodo desejado em 
     * formato de lista de itens de formulario.
     * @param request request recebida da tela.
     * @return String retorno para a tela.
     */
    public String operacao(HttpServletRequest request) {

        HttpSession session = request.getSession();
        professor = (ProfessorVO)session.getAttribute("professor");

        DiskFileUpload upload = new DiskFileUpload();
        String retorno = "";
        try {
                List items = upload.parseRequest(request);
                String oper = getCampoLista(items,"operacao");
                if(oper.equals("incluir")){
                        retorno = "document.getElementById('resposta').innerHTML = '"
                                + incluir(items) + "';";
                }
                if(oper.equals("telaAlterar")){
                        retorno = telaAlterar(items);
                }
                if(oper.equals("excluir")){
                        retorno = "alert('"+excluir(items)+"');";
                }
                if(oper.equals("alterar")){
                        retorno = "alert('"+alterar(items)+"');";
                }
        } catch (FileUploadException e) {
                return retorno;
        }

        return retorno;
    }

    /**
     * Recebe a lista de items do formul�rio e retorna o campo desejado.
     * @param items lista de items multipart/form-data.
     * @param nome nome do campo cujo valor ser� retornado.
     * @return String com os dados armazenados no campo em quest�o.
     */
    private String getCampoLista(List items, String nome){
        String valor = "";
        try {
            Iterator itr = items.iterator();
            while (itr.hasNext()) {
                FileItem item = (FileItem) itr.next();
                if (item.isFormField()) {
                        if(item.getFieldName().equals(nome)){
                                valor = item.getString();
                        }
                }
            }
        } catch (Exception e) {
            System.err.println("Erro ao recuperar valores dos campos: getCampoRequest");
            e.printStackTrace();
        }
        return valor;
    }

    /**
     * Recebe a lista de itens do formulario, inclui o material e seus dados no banco.
     * @param items lista de items multipart/form-data.
     * @return String frase confirmando a inclus�o do material.
     */
    private String incluir(List items) {

            String retorno = "";
            material = new MaterialVO();
            daoMaterial = new MaterialDAO();
            daoTurma = new TurmaDAO();
            ArrayList listaTurmas = new ArrayList();
            ArrayList turmasAdd = new ArrayList();
            if(professor.getStCoordenador().equals("S")){
                listaTurmas = daoTurma.consultarTurmaPorProfessor(professor);
                turma = (TurmaVO) listaTurmas.get(0);
                listaTurmas = daoTurma.consultarTurmaPorCurso(turma.getCurso());
            } else {
                listaTurmas = daoTurma.consultarTurmaPorProfessor(professor);
            }
            for(int i = 0; i < listaTurmas.size();i++){
                turma = (TurmaVO) listaTurmas.get(i);
                if(getCampoLista(items,turma.getIdTurma().toString()).equals("")){
                    turmasAdd.add(listaTurmas.get(i));
                }
            }
            material.setNoMaterial(getCampoLista(items, "nome") + "." + getCampoLista(items, "tipo"));
            //material.setTbTurmaIdTurma(new Integer(getCampoLista(items, "cbTurma")));
            try {
                    material.setLkMaterial(FileUploadUtil.fazerUpload(items));
            } catch (Exception e) {
                    e.printStackTrace();
            }

            if (!material.getLkMaterial().equals("Nenhum arquivo foi carregado") && daoMaterial.incluir(material,turmasAdd)) {
                    retorno = "Material incluido com sucesso";
            } else {
                    retorno = "Erro ao incluir material";
            }
            return retorno;
    }

    /**
     * Recebe o professor e retorna uma combo com a lista de turmas relacionadas
     * a ele.
     * @param professor professor recebido da session.
     * @return String String com o codigo da combo.
     */
    public String getComboTurma(HttpServletRequest request) {
        professor = (ProfessorVO) request.getSession().getAttribute("professor");
        StringBuffer sb = new StringBuffer();
        daoTurma = new TurmaDAO();
        ArrayList aList = new ArrayList();
        if(professor.getStCoordenador().equals("S")){
            aList = daoTurma.consultarTurmaPorProfessor(professor);
            turma = (TurmaVO) aList.get(0);
            aList = daoTurma.consultarTurmaPorCurso(turma.getCurso());
        } else {
            aList = daoTurma.consultarTurmaPorProfessor(professor);
        }
        sb.append("<SELECT NAME='cbTurma'>");
        sb.append("<OPTION VALUE='0'>Escolha uma Turma</OPTION>");
        for (int i = 0; i < aList.size(); i++) {
            turma = (TurmaVO) aList.get(i);
            disciplina = turma.getDisciplina();
            sb.append("<OPTION VALUE='" + turma.getIdTurma().toString() + "'>" +
                    disciplina.getNoDisciplina()+ " "+ turma.getSgTurma() + "</OPTION>");
        }
        sb.append("</SELECT>");

        return sb.toString();
}

    public String getCheckBoxTurmas(HttpServletRequest request){
        professor = (ProfessorVO) request.getSession().getAttribute("professor");
        StringBuffer sb;
        daoTurma = new TurmaDAO();
        ArrayList aList = new ArrayList();
        if(professor.getStCoordenador().equals("S")){
            aList = daoTurma.consultarTurmaPorProfessor(professor);
            turma = (TurmaVO) aList.get(0);
            aList = daoTurma.consultarTurmaPorCurso(turma.getCurso());
        } else {
            aList = daoTurma.consultarTurmaPorProfessor(professor);
        }
        sb = new StringBuffer("<table width='40%'><tr><td colspan='3'>Turmas: " +
                "</td></tr><tr>");
        for(int i=0;i<aList.size();i++){
            turma = (TurmaVO) aList.get(i);
            disciplina = turma.getDisciplina();
            if(i%3 == 0){
                sb.append("</tr><tr><td align='left'><input type='checkbox' name='"+turma.getIdTurma()+"'" +
                        "value='"+turma.getIdTurma()+"'/>"+disciplina.getNoDisciplina()+" "+
                        turma.getSgTurma()+"</td>");
            } else {
                sb.append("<td align='left'><input type='checkbox' name='"+turma.getIdTurma()+"'" +
                        "value='"+turma.getIdTurma()+"'/>"+disciplina.getNoDisciplina()+" "+
                        turma.getSgTurma()+"</td>");
            }
        }
        sb.append("</table>");
        return sb.toString();
    }

    /**
     * Recebe a request e retorna uma tabela de materiais das disciplinas do professor.
     * @param request da qual ser� retirado o professor da session.
     * @return String string com o c�digo HTML da tabela com os materiais.
     */
    public String getTabelaMateriais(HttpServletRequest request){
        StringBuffer retorno = new StringBuffer();
        professor = (ProfessorVO) request.getSession().getAttribute("professor");
        daoMaterial = new MaterialDAO();
        daoDisciplina = new DisciplinaDAO();
        daoTurma = new TurmaDAO();
        disciplina = new DisciplinaVO();
        ArrayList listaMateriais = new ArrayList();
        ArrayList listaTotal = new ArrayList();
        ArrayList listaTurmas;

        if(professor.getStCoordenador().equals("N")){
            listaTurmas = daoTurma.consultarTurmaPorProfessor(professor);
        } else {
            listaTurmas = daoTurma.consultarTurmaPorProfessor(professor);
            turma = (TurmaVO) listaTurmas.get(0);
            listaTurmas = daoTurma.consultarTurmaPorCurso(turma.getCurso());
        }
        if(listaTurmas.size() == 0){
                retorno.append("Professor nao associado a nenhuma turma");
        } else {
                	
                retorno.append("<table border='1' cellpadding='4' width='80%'>" +
                                "<tr><td width='3%'> &nbsp;</td><td>Nome</td><td>Turma(s)</td><td>Arquivo</td></tr>");    
                listaMateriais = daoMaterial.consultarMateriaisPorTurmas(listaTurmas);
                listaTotal.addAll(listaMateriais);
                Iterator itMaterial = listaMateriais.iterator();
                while(itMaterial.hasNext()){
                    material = (MaterialVO) itMaterial.next();
                    listaTurmas = daoTurma.consultarTurmaPorMaterial(material);
                    Iterator itTurma = listaTurmas.iterator();
                    retorno.append("<tr><td>"+
                    "<input type='radio' name='radio' value='"+material.getIdMaterial()+"'/></td>"+
                    "<td>"+material.getNoMaterial()+"</td><td>");
                    while(itTurma.hasNext()){
                        turma = (TurmaVO) itTurma.next();
                        disciplina = turma.getDisciplina();
                        retorno.append(disciplina.getNoDisciplina()+" turma "+ turma.getSgTurma() + " ");
                    }
                    retorno.append("</td><td> <a href=\""+material.getLkMaterial()+"\"> Baixar </a> </td></tr>");

                }
                if(listaTotal.size() == 0){
                        retorno = new StringBuffer();
                        retorno.append("Nenhum material associado a as turmas do professor");
                } else {
                        retorno.append("</table>" +
                                        "<br/>"+
                "<table>"+
                        "<tr>"+
                                "<td>"+
                                        "<input type='hidden' name='operacao'/>"+
                                        "<input type='hidden' name='idMaterial'/>"+
                                        "<input type='submit' value='Alterar' onclick='alterar();'/>"+
                                "</td>"+
                                "<td><input type='submit' value='Excluir' onclick='excluir();'/></td>"+
                        "</tr>"+
                "</table>");
                }

        }
        return retorno.toString();
    }

    /**
     * Recebe uma lista de itens , recupera o id do material selecionado e retorna
     * um formul�rio com os dados desse para altera��o.
     * @param items request multipart/form-data transformada em lista de itens de formul�rio.
     * @return String string com o codigo HTML do formul�rio com os dados do material preenchidos.
     */
    private String telaAlterar(List items){

        material = new MaterialVO();
        daoMaterial = new MaterialDAO();
        daoDisciplina = new DisciplinaDAO();
        daoTurma = new TurmaDAO();
        StringBuffer sb = new StringBuffer();
        StringBuffer sbCheckboxes = new StringBuffer();
        material.setIdMaterial(new Integer(getCampoLista(items,"idMaterial")));
        material = daoMaterial.consultarMaterialPorId(material);
        ArrayList aList = new ArrayList();
        if(professor.getStCoordenador().equals("S")){
            aList = daoTurma.consultarTurmaPorProfessor(professor);
            turma = (TurmaVO) aList.get(0);
            aList = daoTurma.consultarTurmaPorCurso(turma.getCurso());
        } else {
            aList = daoTurma.consultarTurmaPorProfessor(professor);
        }
        sbCheckboxes.append("<table width='40%'><tr><td align='left' colspan='3'>Turmas: " +
                "</td></tr><tr>");
        for(int i=0;i<aList.size();i++){
            turma = (TurmaVO) aList.get(i);
            disciplina = turma.getDisciplina();
            String checado ="";
            for (MaterialVO m : daoMaterial.consultarMaterialPorTurma(turma)){
                if(m.getIdMaterial().equals(material.getIdMaterial())){
                    checado = "checked";
                }
            }
            if(i%3 == 0){
                sbCheckboxes.append("</tr><tr><td align='left'><input type='checkbox' "+checado+" name='"+turma.getIdTurma()+"'" +
                        "value='"+turma.getIdTurma()+"'/>"+disciplina.getNoDisciplina()+" "+
                        turma.getSgTurma()+"</td>");
            } else {
                sbCheckboxes.append("<td align='left'><input type='checkbox' "+checado+" name='"+turma.getIdTurma()+"'" +
                        "value='"+turma.getIdTurma()+"'/>"+disciplina.getNoDisciplina()+" "+
                        turma.getSgTurma()+"</td>");
            }
        }
        sbCheckboxes.append("</table>");
        String nome = material.getNoMaterial().substring(0,material.getNoMaterial().lastIndexOf("."));
        String tipo = material.getNoMaterial().substring(material.getNoMaterial().lastIndexOf(".")+ 1,
                        material.getNoMaterial().length());


        sb.append("<h1 align='center'>Alterar Material</h1>" +
                                "<div align='right' id='links'>" + 
                        "<button onclick='voltar()'>Voltar</button></div>");
        sb.append("<div id='formulario' align='center'>"+
                        "<table width='40%'>"+
                                "<tr>"+
                                        "<td width='15%' align='left'>Id:</td>"+
                                        "<td align='left'><input size='5' type='text' value='"+material.getIdMaterial()+"' disabled='disabled'/>" +
                                                        "<input type='hidden' value='"+material.getIdMaterial()+"' name='id'/></td>"+
                                "</tr>"+
                                "<tr>"+
                                        "<td width='15%' align='left'>Nome:</td>"+
                                        "<td><input type='text' name='nome' value='"+nome+"' maxlength='14' size='67'/></td>"+
                                "</tr>"+
                                "<tr>"+
                                        "<td width='15%' align='left'>Tipo:</td>"+
                                        "<td><input type='text' name='tipo' value='"+tipo+"' maxlength='5' size='67'/></td>"+
                                "</tr>"+
                                "<tr>"+
                                "<tr>"+
                                        "<td width='15%'>Arquivo:</td>"+
                                        "<td>"+
                                                "<input type='file' size='52' name='file' onchange='selecionado();'>"+
                                                "<input type='hidden' name='arquivo'/>"+
                                        "</td>"+
                                "</tr>"+
                                "</table>"+
                                sbCheckboxes.toString() +
                                "<table>"+
                                "<tr>"+
                                        "<td >"+
                                        "</td>"+
                                        "<td align='left'> "+
                                                "<input type='submit' value='Alterar'/> &nbsp;"+
                                                "<input type='button' value='Padrao' onclick='limpar();'/>"+
                                                "<input type='hidden' value='alterar' name='operacao'/>"+
                                        "</td>"+
                                "</tr>"+				
                        "</table>"+
                "</div>"+
                "<br/>"+
        "</form>");
        return sb.toString();
    }

    /**
     * Recebe a lista de itens do formul�rio, susbtitui arquivo antigo pelo novo
     * no servidor e altera os dados do material no banco.
     * @param items lista de items multipart/form-data.
     * @return String frase confirmando a altera��o do material.
     */
    private String alterar(List items){

            String retorno = "";
            material = new MaterialVO();
            turma = new TurmaVO();
            daoMaterial = new MaterialDAO();
            daoTurma = new TurmaDAO();
            ArrayList listaTurmas = new ArrayList();
            ArrayList turmasAdd = new ArrayList();
            //Elicita as turmas selecionadas na tela 
            if(professor.getStCoordenador().equals("S")){
                listaTurmas = daoTurma.consultarTurmaPorProfessor(professor);
                turma = (TurmaVO) listaTurmas.get(0);
                listaTurmas = daoTurma.consultarTurmaPorCurso(turma.getCurso());
            } else {
                listaTurmas = daoTurma.consultarTurmaPorProfessor(professor);
            }
            for(int i = 0; i < listaTurmas.size();i++){
                turma = (TurmaVO) listaTurmas.get(i);
                if(!getCampoLista(items,turma.getIdTurma().toString()).equals("")){
                    turmasAdd.add(listaTurmas.get(i));
                }
            }
            
            //Seta o id do material, vindo da tela
            material.setIdMaterial(new Integer(getCampoLista(items, "id")));

            //pega o objeto material do banco
            material = daoMaterial.consultarMaterialPorId(material);

            //exclui o arquivo do servidor
            FileUploadUtil.excluirArquivo(material.getLkMaterial());

            //incorpora alteracoes de tela
            material.setNoMaterial(getCampoLista(items, "nome") + "." + getCampoLista(items, "tipo"));

            //inclui novo arquivo no servidor
            try {
                material.setLkMaterial(FileUploadUtil.fazerUpload(items));
            } catch (Exception e) {
                retorno = "Erro ao alterar material";
                e.printStackTrace();
                return retorno;
            }

            //altera os dados do arquivo no banco
            if (!material.getLkMaterial().equals("Nenhum arquivo foi carregado") && daoMaterial.alterar(material,turmasAdd)){
                    retorno = "Material alterado com sucesso";
            } else {
                    retorno = "Erro ao alterar material";
            }
            return retorno;
    }

    /**
     * Recebe a lista de itens do formul�rio, exclui o arquivo no caminho armazenado no banco e
     * exclui os dados do material no banco.
     * @param items lista de items multipart/form-data.
     * @return String frase confirmando a altera��o do material.
     */
    private String excluir(List items){

            String retorno = "";
            material = new MaterialVO();
            daoMaterial = new MaterialDAO();
            material.setIdMaterial(new Integer(getCampoLista(items,"idMaterial")));
            material = daoMaterial.consultarMaterialPorId(material);
            if (FileUploadUtil.excluirArquivo(material.getLkMaterial()) && daoMaterial.excluir(material)){
                    retorno = "Material excluido com sucesso";
            } else {
                    retorno = "Erro ao excluir material";
            }
            return retorno;
    }
	
}
